#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include "addfrienddialog.h"
#include "groupsessiondetailwidget.h"
#include "messageeditarea.h"
#include "messageshowarea.h"
#include "model/data.h"
#include "selfinfowidget.h"
#include "sessiondetailwidget.h"
#include "sessionfriendarea.h"

#include <QGridLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui
{
class MainWidget;
}
QT_END_NAMESPACE

class MainWidget : public QWidget
{
    Q_OBJECT
  private:
    static MainWidget *instance;
    MainWidget(QWidget *parent = nullptr);

  public:
    static MainWidget *getInstance();
    ~MainWidget();

  private:
    Ui::MainWidget *ui;

    // 窗口最左侧部分
    QWidget *_windowLeft;
    // 窗口中间部分
    QWidget *_windowMid;
    // 窗口最右侧部分
    QWidget *_windowRight;

    // 用户头像
    QPushButton *_userAvatar;
    // 会话标签页按钮
    QPushButton *_sessionTabBtn;
    // 好友标签页按钮
    QPushButton *_friendTabBtn;
    // 好友申请标签页按钮
    QPushButton *_applyTabBtn;

    // 用户搜索框
    QLineEdit *_searchEdit;
    // 添加好友按钮
    QPushButton *_addFriendBtn;

    SessionFriendArea *_sessionFriendArea;

    // 显示会话标题
    QLabel *_sessionTitleLabel;

    // 显示会话详情按钮
    QPushButton *_extraBtn;

    // 消息展示区
    MessageShowArea *_messageShowArea;
    // 消息编辑区
    MessageEditArea *_messageEditArea;

    enum ActiveTab
    {
        SESSION_LIST,
        FRIEND_LIST,
        APPLY_LIST
    };
    ActiveTab _activeTab = SESSION_LIST;

  public:
    void initMainWindow();
    void initLeftWindow();
    void initMidWindow();
    void initRightWindow();
    void initSignalSlot();
    void initWebsocket();

    void switchTabToSession();
    void switchTabToFriend();
    void switchTabToApply();
    void switchSession(const QString &userId);

    void loadSessionList();
    void updateChatSessionList();

    void loadFriendList();
    void updateFriendList();

    void loadApplyList();
    void updateApplyList();

    void loadRecentMessage(const QString &chatSessionId);
    void updateRecentMessage(const QString &chatSessionId);

    MessageShowArea *getMessageShowArea();
};
#endif // MAINWIDGET_H
